Snowflake のネットワークポリシーでユーザー種別ごとの制限を設定する

Snowflake のネットワークポリシーでユーザー種別ごとの制限を設定する

Clock Icon2025.01.16

とーかみです。

Snowflake で接続元 IP 制限を行う際は、ネットワークポリシーによる制御を行います。

接続元 IP 制限は、全体で一律ではなくユーザー種別(人間用、サービス用)ごとに制限内容を切り替えたい場合があるため、設定例を検証してみました。

Snowflake ネットワークポリシーとは

https://docs.snowflake.com/ja/user-guide/network-policies

Snowflake ネットワークポリシーは、許可リストまたはブロックリストを用いて Snowflake サービスや内部ステージに対するアクセス制御を行うことができるものです。

Snowflake ネットワークルールとは

https://docs.snowflake.com/ja/user-guide/network-rules

Snowflake ネットワークルールは、ネットワークポリシーでアクセス制御ルールを設定する際に使用するルールの塊です。

ネットワークルールは以下の公式ドキュメントの記述サンプルの記載のように、モード、識別子タイプ、値リストを指定します。

ネットワークポリシーでは、ネットワークルールを複数指定することができます。

CREATE NETWORK RULE block_public_access
  MODE = INGRESS
  TYPE = IPV4
  VALUE_LIST = ('0.0.0.0/0');

CREATE NETWORK RULE allow_vpceid_access
  MODE = INGRESS
  TYPE = AWSVPCEID
  VALUE_LIST = ('vpce-0fa383eb170331202');

CREATE NETWORK POLICY allow_vpceid_block_public_policy
  ALLOWED_NETWORK_RULE_LIST = ('allow_vpceid_access')
  BLOCKED_NETWORK_RULE_LIST=('block_public_access');

ルールは適用範囲が小さいものが優先される

https://docs.snowflake.com/ja/user-guide/network-policies#label-network-policy-precedence

ネットワークポリシーは、アカウント、セキュリティ統合、またはユーザーに適用できます。複数のネットワークポリシーが適用されている場合、最も具体的なネットワークポリシーが、一般的なネットワークポリシーよりも優先されます。

アカウント
アカウントに適用されるネットワークポリシーは、最も一般的なネットワークポリシーです。これらのポリシーよりも、セキュリティ統合またはユーザーに適用されるネットワークポリシーが優先されます。

セキュリティ統合
セキュリティ統合に適用されるネットワークポリシーは、アカウントに適用されるネットワークポリシーよりも優先されますが、ユーザーに適用されるネットワークポリシーのほうが優先されます。

ユーザー
ユーザーに適用されるネットワークポリシーは、最も具体的なネットワークポリシーです。これらのポリシーは、アカウントとセキュリティ統合の両方よりも優先されます。

ドキュメントの上記の記述の通り、適用範囲が小さいものほど優先されます。

  • アカウントは Snowflake アカウントを指します
  • セキュリティ統合は外部サービスとの連携やフェデレーションを設定する際に使用する接続用のオブジェクトです
  • ユーザーは個々の Snowflake ユーザーを指します

優先度を表現すると ユーザー > セキュリティ統合 > アカウント のようになります。

想定する利用シーン

今回の設定例では以下のようなアクセスがあるシーンを想定します。

  • 人間のユーザーが社内ネットワークからアクセスする
  • AWS Lambda のような外部ツールからサービスとしてアクセスする

設定する内容

  • アカウント単位の設定
    • 社内ネットワークを想定した IP アドレス(または CIDR ブロック)からのアクセスを許可
  • ユーザー単位の設定
    • Lambda からアクセスする際に仕様するサービス用のユーザーに対して設定
    • Lambda から接続時に接続元となる IP アドレス(または CIDR ブロック)からのアクセスを許可
      • 実際には NAT Gateway の Elastic IP や Lambda サービスの CIDR ブロックを指定することを想定します

設定と動作確認

記載している IP アドレス、 CIDR ブロックはサンプルです。

1. アカウント単位に許可ルールを設定し、範囲外の IP からのアクセスが拒否される

次のようなネットワークルール、ネットワークポリシーを作成し、アカウント単位に設定します。

USE SECURITYADMIN;

-- ネットワークルールを作成
CREATE OR REPLACE NETWORK RULE network_rule_sample_01
    MODE = INGRESS
    TYPE = IPV4
    VALUE_LIST = ( '203.0.113.0/24' )
    COMMENT = 'company network'
;

-- 作成したネットワークルールを利用したネットワークポリシーを作成
CREATE NETWORK POLICY test_network_policy_01
    ALLOWED_NETWORK_RULE_LIST = ('network_rule_sample_01')
;

-- アカウントに対してネットワークポリシーを適用
ALTER ACCOUNT SET NETWORK_POLICY = test_network_policy_01;

許可ルールに指定した IP 範囲外からアクセスすると画像のようにサインインできないことが確認できました。

01_access_denied

2. ユーザー単位に許可ルールを設定し、許可した IP からのアクセスが許可される

次のようなネットワークルール、ネットワークポリシーを作成し、ユーザー単位に設定します。

USE SECURITYADMIN;

-- ネットワークルールを作成
CREATE OR REPLACE NETWORK RULE network_rule_sample_02
    MODE = INGRESS
    TYPE = IPV4
    VALUE_LIST = ( '198.51.100.0/24' )
    COMMENT = 'custom ip'
;

-- 作成したネットワークルールを利用したネットワークポリシーを作成
CREATE NETWORK POLICY test_network_policy_02
    ALLOWED_NETWORK_RULE_LIST = ('network_rule_sample_02')
;

-- 特定のユーザーに対してネットワークポリシーを適用
ALTER USER access_test_user SET NETWORK_POLICY = test_network_policy_02;

先ほど拒否されたものと同じ IP アドレスから接続している状態で再度サインインを試みると、サインインできることが確認できました。

02_access_allowed

まとめ

複数のネットワークポリシーを組み合わせてユーザー種別ごとに接続元 IP 制限を行う設定例を検証しました。

適用範囲を組み合わせることにより、人間用、サービス用ユーザーごとにネットワークポリシーを分けて制御することができます。

サービス用ユーザーは MFA 必須化にともない TYPE = SERVICE 属性を指定することになりますが、ネットワークポリシーとしては区別せず設定を行う形になります。

参考

ネットワークポリシーは各オブジェクトに 1 つのみ設定できるため、別のネットワークポリシーを新たに設定した場合は既存のネットワークポリシーは適用されなくなります。
ネットワークポリシーの除外のみを行う場合は UNSET を使用します。

DROP NETWORK POLICY はネットワークポリシー自体の削除が行われます。

-- アカウントに対してネットワークポリシーを除外
ALTER ACCOUNT UNSET NETWORK_POLICY;

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.